Predavani binarnich dat pres COM/DCOM
Otázka od: Karel Kimes
4. 11. 2002 19:04
ahoj,
chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji ).
Videl bych to asi takhle:
1) klient - vytvorit objekt implementujici napr. IStream
2) klient - naplnit IStream
3) klient - poslat IStream jako parametr v nejake metode, napr.
SetData(Stream) do COM objektu. ( procedure SetData(Stream : IStream); )
4) COM objekt - v COM objektu pracovat s daty (ulozit do DB, atd.)
(implementace SetData obdrzi v promene Stream ukazatel na IStream, je to tak?)
Co vy na to? (trocha kodu by taky neskodila)
dik
kchodl
Odpovedá: Jan Sebelík
5. 11. 2002 9:29
> Odesílatel: Karel Kimes <kkonf@email.cz>
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji ).
Ja to delam pres typ OLEVariant.
A:=VarArrayCreate(..., varByte)
pak tam na nejakej pointer (pretypovani pres TVarData, myslim) udelam "move"
dat a je to.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 493 792 931 (mobil 776 347735)
=========================================
Odpovedá: Richard Kejval
5. 11. 2002 8:54
Ahoj,
ja posilam binarni data na DCOM server pres OleVariant.
napr : file
klient:
procedure TClient.DataSQLToServer;
var TempStream:TMemoryStream;
Buffer:PChar; P:Pointer; L:Integer; V:OleVariant;
begin
TempStream:=TMemoryStream.Create;
try
TempStream.LoadFromFile(NejakyFile);
L:=TempStream.Size;
GetMem(Buffer,L);
TempStream.ReadBuffer(Buffer^,L);
finally
TempStream.Free;
end;
V:=VarArrayCreate([0,L-1], varByte);
P:=VarArrayLock(V);
try
Move(Buffer^,P^,L);
finally
VarArrayUnLock(V);
end;
Server.DataSQL:=V;
end;
end;
Server:
IServer = interface(IDispatch)
['{ED442BBB-873E-42B5-B396-746216DB23CA}']
function Get_DataSQL: OleVariant; safecall;
procedure Set_DataSQL(Value: OleVariant); safecall;
property DataSQL: OleVariant read Get_DataSQL write Set_DataSQL;
....
end;
procedure TServer.Set_DataSQL(Value: OleVariant);
var P:Pointer; L:integer; Buffer:PChar;
TempStream:TMemoryStream;
begin
L:=VarArrayHighBound(Value,1)-VarArrayLowBound(Value,1)+1;
GetMem(Buffer,L);
P:=VarArrayLock(Value);
try
Move(P^,Buffer^,L);
finally
VarArrayUnLock(Value);
end;
TempStream:=TMemoryStream.Create;
try
TempStream.WriteBuffer(Buffer^,L);
finally
TempStream.Free;
end;
end;
Je to jen takovy nastin, takze doufam, ze je to z toho pochopitelne.
Pro ziskani dat ze serveru obdobne.
S pozdravem
ing. Richard Kejval
IC Software s.r.o
> ahoj,
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji ).
>
> Videl bych to asi takhle:
> 1) klient - vytvorit objekt implementujici napr. IStream
> 2) klient - naplnit IStream
> 3) klient - poslat IStream jako parametr v nejake metode, napr.
> SetData(Stream) do COM objektu. ( procedure SetData(Stream : IStream); )
> 4) COM objekt - v COM objektu pracovat s daty (ulozit do DB, atd.)
> (implementace SetData obdrzi v promene Stream ukazatel na IStream, je to
tak?)
>
> Co vy na to? (trocha kodu by taky neskodila)
>
>
> dik
>
> kchodl
>
>
>
Odpovedá: Martin Schayna
5. 11. 2002 11:55
----- Original Message -----
From: "Karel Kimes" <kkonf@email.cz>
> chtel bych z jedne aplikace do druhe predat blok binarnich dat. Existuje
> sice rada zpusobu, jak to udelat (mapovane soubory, "raw" soubory,
> clipboard), ALE ja to potrebuju predavat na vzdaleny stroj => DCOM (i zde
> existuje rada zpusobu, ALE drzme se ted technologie DCOM, dekuji ).
Predavej do metod promennou typu Variant - pole bytu.
To je jediny OLEAutomation kompatibilni typ kterym lze posilat
binarni data s malym overheadem. Prenasi se pak pouze tolik
bytu jako je bytu v poli + 16 bytu navic. Kazdy jine pole ve
Variantu ma o hodne vetsi "spotrebu".
Viz VarArrayCreate pro vytvoreni, VarArrayLock a
VarArrayUnlock pro naplneni z pameti.
Martin Schayna